package com.agriculture.competition.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Component;

/**
 * 计算分数工具类
 * @author 10555
 */
@Component
public class CalculateUtils {

    /**
     * 求平均数
     * @param scores
     * @return
     */
    public static double calculateAverage(List<Double> scores) {
        if (scores == null) {
            throw new IllegalArgumentException("List must contain data.");
        }
        int sum = 0;
        for (double score : scores) {
            sum += score;
        }
        return sum / scores.size();
    }

    /**
     * 去掉最高分和最低分，求平均数
     * @param scores 源数据
     * @param count 去掉最高分和最低分的个数
     * @return
     */
    public static double calculateAdjustedAverage(List<Double> scores, int count) {
        if (scores == null) {
            throw new IllegalArgumentException("List must contain data.");
        }
        // 首先对数组进行排序
        Collections.sort(scores);

        // 计算去掉最高分和最低分后的数组长度
        // 因为要移除最高分和最低分
        int lengthAfterRemoval = scores.size() - (count * 2);

        // 如果数组长度小于等于移除的分数数量，则无法移除两个最高分和两个最低分，直接返回平均值
        if (lengthAfterRemoval <= count * 2) {
            // 直接计算平均值，因为没有足够的元素可以移除
            return calculateAverage(scores);
        }

        // 创建新的数组来存储移除后的分数
        List<Double> adjustedScores = new ArrayList<>();
        // 从索引2开始复制，跳过前两个最低分
        System.arraycopy(scores, count, adjustedScores, 0, lengthAfterRemoval);

        // 计算调整后的平均值
        return calculateAverage(adjustedScores);
    }

    /**
     * 求中位数
     * @param scores
     * @return
     */
    public static double findMedian(List<Double> scores) {
        if (scores == null) {
            throw new IllegalArgumentException("List must contain data.");
        }
        Collections.sort(scores);
        int n = scores.size();
        if (n % 2 == 0) {
            return ((scores.get(n / 2 - 1) + scores.get(n / 2)) / 2);
        } else {
            return scores.get(n / 2);
        }
    }

    /**
     * 最小分数
     * @param scores
     * @return
     */
    public static double findMinScore(List<Double> scores) {
        if (scores == null) {
            throw new IllegalArgumentException("List must contain data.");
        }
        Collections.sort(scores);
        return scores.get(0);
    }

    /**
     * 最大分数
     * @param scores
     * @return
     */
    public static double findMaxScore(List<Double> scores) {
        if (scores == null) {
            throw new IllegalArgumentException("List must contain data.");
        }
        Collections.sort(scores);
        return scores.get(scores.size() - 1);
    }

}
